package com.mianle.userapi.util;

import ch.hsr.geohash.GeoHash;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: yiyuan
 * @Description:
 * @Date: Created in 11:27 2018/5/22
 */
public final class LbsUtil {


    private static final double EARTH_RADIUS = 6378.137;

    /**
     * GeoHash Length      width            height
     * 1                  5,009.4km        4,9992.6km
     * 2                  1,252.3km        624.km
     * 3                  156.5km          156km
     * 4                  39.1km           19.5km
     * 5                  4.9km            4.9km
     * 6                  1.2km            609.4m
     * 7                  152.9m           152.4m
     * 8                  38.2m            19m
     * 9                  4.8m             4.8m
     * 10                 1.2m             59.5m
     * 11                 14.9cm           149.cm
     * 12                 3.7cm            1.9cm
     *
     * @param lng                经度
     * @param lat                纬度
     * @param numberOfCharacters GeoHash 长度
     * @return 返回坐标相邻的矩形
     */
    public static List<String> getAdjacent(Double lng, Double lat, int numberOfCharacters) {
        GeoHash geoHash = GeoHash.withCharacterPrecision(lat, lng, numberOfCharacters);
        //获取相邻的8个GeoHash的值, N, NE, E, SE, S, SW, W, NW
        GeoHash[] adjacent = geoHash.getAdjacent();
        List<String> paramList = new ArrayList<>(9);
        for (GeoHash hash : adjacent) {
            paramList.add(hash.toBase32());
        }
        paramList.add(geoHash.toBase32());
        return paramList;
    }

    /**
     * @param lng                经度
     * @param lat                纬度
     * @param numberOfCharacters GeoHash 长度
     * @return 返回坐标GeoHash 字符串
     */
    public static String geoHashEncode(Double lng, Double lat, int numberOfCharacters) {
        GeoHash geoHash = GeoHash.withCharacterPrecision(lat, lng, numberOfCharacters);
        return geoHash.toBase32();
    }

    /**
     * 计算两点之间直线距离
     *
     * @param longitude1
     * @param latitude1
     * @param longitude2
     * @param latitude2
     * @return 返回距离
     */
    public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
        // 纬度
        double Lat1 = rad(latitude1);
        double Lat2 = rad(latitude2);
        //两点纬度之差
        double a = Lat1 - Lat2;
        //经度之差
        double b = rad(longitude1) - rad(longitude2);
        //计算两点距离的公式
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(Lat1) * Math.cos(Lat2) * Math.pow(Math.sin(b / 2), 2)));
        //弧长乘地球半径（半径为米）
        s = s * EARTH_RADIUS;
        //精确距离的数值
        s = Math.round(s * 10000d) / 10000D;
        return s;
    }

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }


    public static void main(String[] args) {
        //wt02         //wt02

        //景德镇 wt5q wt62 九江
        //wqj7
        System.out.println(geoHashEncode(126.725517,45.99212, 4));
    }

}
